{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch.utils.data import Dataset    # Dataset读取单个样本的抽象类，包括读取样本的标签、样本的索引、样本的特征\n",
    "from torch.utils.data import DataLoader   # 数据加载器，组合数据集和采样器，并在数据集上提供单进程或多进程迭代器\n",
    "from torchvision import datasets    # torchvision是PyTorch中专门用于图像处理的库,datasets是其中的数据集模块\n",
    "from torchvision.transforms import ToTensor\n",
    "\n",
    "from torch.nn import functional as F\n",
    "from torch import nn, optim\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_curve(data):\n",
    "    \"\"\"\n",
    "    下降曲线的绘制\n",
    "    :param data:\n",
    "    :return:\n",
    "    \"\"\"\n",
    "    # fig = plt.figure()\n",
    "    plt.plot(range(len(data)), data, color='blue')  #range(len(data))用于生成一个从0到len(data)的整数序列表示横坐标，data表示纵坐标，color表示颜色\n",
    "    plt.legend(['value'], loc='upper right')#图例，loc表示位置\n",
    "    plt.xlabel('step')#横坐标\n",
    "    plt.ylabel('value')#纵坐标\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "def plot_image(img, label, name):\n",
    "    # fig = plt.figure()\n",
    "    for i in range(6):\n",
    "        plt.subplot(2, 3, i + 1)     # 2行3列,i+1表示第几个子图\n",
    "        plt.tight_layout()  # 自动调整子图参数，使之填充整个图像区域\n",
    "        plt.imshow(img[i][0], cmap='gray', interpolation='none')  # img0维度存储的是图片，i是第i张图片。interpolation表示插值方法\n",
    "        plt.title(\"{}: {}\".format(name, label[i].item())) # 显示标题，label[i].item()表示取出label中的第i个元素，item()将tensor转换为标量，用于画图\n",
    "        plt.xticks([])\n",
    "        plt.yticks([])\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# def one_hot(label, depth=10):\n",
    "#     \"\"\"\n",
    "#     one_hot编码\n",
    "#     :param label:\n",
    "#     :param depth:\n",
    "#     :return:\n",
    "#     \"\"\"\n",
    "#     out = torch.zeros(label.size(0), depth)\n",
    "#     idx = torch.LongTensor(label).view(-1, 1)\n",
    "#     out.scatter_(dim=1, index=idx, value=1)\n",
    "#     return out\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('LSUN', 'LSUNClass', 'ImageFolder', 'DatasetFolder', 'FakeData', 'CocoCaptions', 'CocoDetection', 'CIFAR10', 'CIFAR100', 'EMNIST', 'FashionMNIST', 'QMNIST', 'MNIST', 'KMNIST', 'StanfordCars', 'STL10', 'SUN397', 'SVHN', 'PhotoTour', 'SEMEION', 'Omniglot', 'SBU', 'Flickr8k', 'Flickr30k', 'Flowers102', 'VOCSegmentation', 'VOCDetection', 'Cityscapes', 'ImageNet', 'Caltech101', 'Caltech256', 'CelebA', 'WIDERFace', 'SBDataset', 'VisionDataset', 'USPS', 'Kinetics', 'HMDB51', 'UCF101', 'Places365', 'Kitti', 'INaturalist', 'LFWPeople', 'LFWPairs', 'KittiFlow', 'Sintel', 'FlyingChairs', 'FlyingThings3D', 'HD1K', 'Food101', 'DTD', 'FER2013', 'GTSRB', 'CLEVRClassification', 'OxfordIIITPet', 'PCAM', 'Country211', 'FGVCAircraft', 'EuroSAT', 'RenderedSST2', 'Kitti2012Stereo', 'Kitti2015Stereo', 'CarlaStereo', 'Middlebury2014Stereo', 'CREStereo', 'FallingThingsStereo', 'SceneFlowStereo', 'SintelStereo', 'InStereo2k', 'ETH3DStereo')\n"
     ]
    }
   ],
   "source": [
    "def load_dataset():\n",
    "    #从torchversion加载自带数据集\n",
    "    training_data = datasets.MNIST(\n",
    "    root=\"../data\",    # 数据集存放路径\n",
    "    train=True,    # 是否为训练集\n",
    "    download=True,    # 是否下载\n",
    "    transform=ToTensor(),    # 数据转换方式\n",
    "    # transform=torchvision.transforms.Compose([  # 数据转换方式\n",
    "    #     torchvision.transforms.ToTensor(),  # 将PIL.Image或numpy.ndarray转换为torch.FloatTensor，并归一化到[0,1]\n",
    "    #     torchvision.transforms.Normalize(   # 标准化，均值为0，标准差为1\n",
    "    #         (0.1307,), (0.3081,))   # 均值和标准差\n",
    "    # ])\n",
    "    )\n",
    "    train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)    # DataLoader是一个迭代器，每次返回一个batch的数据\n",
    "    test_data = datasets.MNIST(\n",
    "        root=\"../data\",\n",
    "        train=False,\n",
    "        download=True,\n",
    "        transform=ToTensor()\n",
    "    )\n",
    "\n",
    "    test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)  \n",
    "    return train_dataloader, test_dataloader\n",
    "#打印datasets支持的数据集\n",
    "print(datasets.__all__)\n",
    "    \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        # xw + b\n",
    "        self.fc1 = nn.Linear(28 * 28, 256)\n",
    "        self.fc2 = nn.Linear(256, 64)\n",
    "        self.fc3 = nn.Linear(64, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        # x: [b, 1, 28, 28]\n",
    "        # h1 = relu(xw1 + b)\n",
    "        input=x #保存输入\n",
    "        x = F.relu(self.fc1(x))\n",
    "        # h2 = relu(h1w2 + b2)\n",
    "        x = F.relu(self.fc2(x))\n",
    "        # h3 = h2w3 + b3\n",
    "        x = self.fc3(x)\n",
    "\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(epoch_num, train_loader, net, optimizer):\n",
    "    train_loss = []\n",
    "    for epoch in range(epoch_num):\n",
    "        for batch_idx, (x, y) in enumerate(train_loader):\n",
    "            \n",
    "        ######################## 3-train用CUDA #################################\n",
    "            x=x.to(device)\n",
    "            y=y.to(device)\n",
    "        #########################################################\n",
    "\n",
    "            # x: [b, 1, 28, 28], y: [512]\n",
    "            # [b, 1, 28, 28] => [b, feature]\n",
    "            x = x.view(x.size(0), 28 * 28)\n",
    "            # => [b, 10]\n",
    "            out = net(x)\n",
    "            # y_onehot = one_hot(y) # [b] => [b, 10]\n",
    "            y_onehot = F.one_hot(y, 10).float()\n",
    "            # loss = mse(out, y_onehot)\n",
    "            loss = F.mse_loss(out, y_onehot)\n",
    "            # print(loss)\n",
    "            optimizer.zero_grad()\n",
    "            loss.backward()\n",
    "            # w' = w - lr * grad\n",
    "            optimizer.step()\n",
    "\n",
    "            train_loss.append(loss.item())\n",
    "\n",
    "            if batch_idx % 100 == 0:\n",
    "                print('epoch {}, batch_idx {}, loss {}'.format(epoch, batch_idx, loss.item()))\n",
    "\n",
    "    return train_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using cuda device\n",
      "torch.Size([64, 1, 28, 28]) torch.Size([64]) tensor(0.) tensor(1.)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 0, batch_idx 0, loss 0.12009145319461823\n",
      "epoch 0, batch_idx 100, loss 0.08073354512453079\n",
      "epoch 0, batch_idx 200, loss 0.0708039402961731\n",
      "epoch 0, batch_idx 300, loss 0.062166906893253326\n",
      "epoch 0, batch_idx 400, loss 0.05255408212542534\n",
      "epoch 0, batch_idx 500, loss 0.04379165172576904\n",
      "epoch 0, batch_idx 600, loss 0.04638739302754402\n",
      "epoch 0, batch_idx 700, loss 0.039944425225257874\n",
      "epoch 0, batch_idx 800, loss 0.04745246842503548\n",
      "epoch 0, batch_idx 900, loss 0.03562216833233833\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABeVklEQVR4nO3de5xM9f8H8Nfs3bK7bmvdFqsQLWKV3EJEKLp8pZLo+lXUulVEKRXd89U3lOjyVfH9Rt9UktWXEiLLRviRWCvtxrrsWva+5/fHp7NzzplzZs7MzsyZ3Xk9H499zMyZM2c+O/b7nVfvz80mSZIEIiIioiASYnUDiIiIiPyNAYiIiIiCDgMQERERBR0GICIiIgo6DEBEREQUdBiAiIiIKOgwABEREVHQCbO6AYGooqICf/zxB2JiYmCz2axuDhEREZkgSRLOnz+Ppk2bIiTEeY2HAUjHH3/8gcTERKubQURERB44fvw4mjdv7vQcBiAdMTExAMQHGBsba3FriIiIyIz8/HwkJiZWfo87wwCkQ+72io2NZQAiIiKqZswMX+EgaCIiIgo6DEBEREQUdBiAiIiIKOhwDBAREZGPlJeXo7S01Opm1CgREREup7ibwQBERETkZZIkIScnB+fOnbO6KTVOSEgIkpKSEBERUaXrMAARERF5mRx+GjVqhOjoaC6q6yXyQsXZ2dlo0aJFlT5XBiAiIiIvKi8vrww/DRo0sLo5NU58fDz++OMPlJWVITw83OPrcBA0ERGRF8ljfqKjoy1uSc0kd32Vl5dX6ToMQERERD7Abi/f8NbnygBEREREQYcBiIiIiIIOAxARERF5RatWrTB//nyrm2EKA5AFLl60ugVERETBjQHIz6ZMAWrXBnbtsrolREREwYsByM/eeEPczpplbTuIiMh/JAm4cMGaH0ky18a3334bzZo1Q0VFher48OHDMXbsWPz2228YMWIEEhISUKdOHVx55ZXYsGGD4fUyMzNhs9mQkZFReezcuXOw2WzYtGlT5bH9+/dj6NChqFOnDhISEjBmzBjk5ua68/F6hAHIIkVFVreAiIj85eJFoE4da37MDrsYOXIkcnNzsXHjxspjZ8+exTfffIPRo0ejoKAAQ4cOxYYNG7B7924MHjwYN954I7Kysjz+XLKzs9G3b19cccUV2LlzJ9atW4c///wTt912m8fXNIsrQVuksNDqFhAREdnVr18f119/PT7++GMMGDAAAPCf//wH9evXx4ABAxAaGorOnTtXnv/888/js88+w5o1azBx4kSP3nPRokXo2rUr5s6dW3ls2bJlSExMxKFDh9C2bduq/VJOMABZhBUgIqLgER0NFBRY995mjR49Gg8++CAWLlyIyMhIfPTRR7j99tsRGhqKCxcu4Nlnn8WXX35ZuRVFYWFhlSpA6enp2LhxI+rUqePw3G+//cYAVBOxAkREFDxsNjEBJtDdeOONqKiowFdffYUrr7wSmzdvxuuvvw4AeOyxx/DNN9/g1VdfxaWXXopatWrhb3/7G0pKSnSvFRIiRtlIikFI8jYhsoqKCtx444146aWXHF7fpEkTb/1auhiALMIKEBERBZpatWrhlltuwUcffYTDhw+jbdu2SElJAQBs3rwZ48aNw8033wwAKCgoQGZmpuG14uPjAYhxPl26dAEA1YBoAOjatStWrVqFVq1aISzMv5GEg6AtwgBERESBaPTo0fjqq6+wbNky3HXXXZXHL730UqxevRoZGRn4+eefceeddzrMGFOqVasWrr76arz44ovYv38/vv/+e8zSTIGeMGECzpw5gzvuuAM7duzAkSNHsH79etx7771V3uzUFQYgizAAERFRILr22mtRv359HDx4EHfeeWfl8TfeeAP16tVDz549ceONN2Lw4MHo2rWr02stW7YMpaWl6NatG1JTU/H888+rnm/atCm2bNmC8vJyDB48GMnJyUhNTUVcXFxlF5qv2CTJ7AoBwSM/Px9xcXHIy8tDbGysV68tb2IbEQEUF3v10kREFACKiopw9OhRJCUlISoqyurm1DjOPl93vr9ZAbKIwZgxIiIi8gMGICIiIgo6DEBEREQUdBiAiIiIfIBDbH3DW58rA5Af+XhGHxERBYDw8HAAwEWzm3CRW+SFF0NDQ6t0HS6E6EeaBTBRVgb4ed0nIiLysdDQUNStWxcnT54EAERHR8MmTwGmKqmoqMCpU6cQHR1d5YUT+fXrR9oAVFQkduolIqKapXHjxgBQGYLIe0JCQtCiRYsqh0oGID/STn0vLGQAIiKqiWw2G5o0aYJGjRo57H9FVRMREeGVRRIZgPxI+78BbohKRFSzhYaGVnmsCvkGB0H7kV4XGBEREfkfA5AfsQJEREQUGBiA/IgBiIiIKDBYHoAWLlxYuaFZSkoKNm/ebHhudnY27rzzTrRr1w4hISGYNGmSwzlLlixBnz59UK9ePdSrVw8DBw7Ejh07fPgbmMcAREREFBgsDUArV67EpEmTMHPmTOzevRt9+vTBkCFDkJWVpXt+cXEx4uPjMXPmTHTu3Fn3nE2bNuGOO+7Axo0bsW3bNrRo0QKDBg3CiRMnfPmrmMIxQERERIHBJlm4Vnf37t3RtWtXLFq0qPJY+/btcdNNN2HevHlOX9uvXz9cccUVmD9/vtPzysvLUa9ePfzzn//E3XffrXtOcXExiouLKx/n5+cjMTEReXl5iI2NNf8LubBjB9C9u/3xRx8Bd97ptcsTEREFtfz8fMTFxZn6/rasAlRSUoL09HQMGjRIdXzQoEHYunWr197n4sWLKC0tRf369Q3PmTdvHuLi4ip/EhMTvfb+StoKUAAUpYiIiIKSZQEoNzcX5eXlSEhIUB1PSEhATk6O195n+vTpaNasGQYOHGh4zowZM5CXl1f5c/z4ca+9v1LPnqLb65FHxOPff/fJ2xAREZELli+EqF3KWpIkr+2Z8vLLL+OTTz7Bpk2bEBUVZXheZGQkIiMjvfKezthsQGQk0LateMwKEBERkTUsC0ANGzZEaGioQ7Xn5MmTDlUhT7z66quYO3cuNmzYgE6dOlX5et7UrJm4ZQWIiIjIGpZ1gUVERCAlJQVpaWmq42lpaejZs2eVrv3KK6/gueeew7p169CtW7cqXcsXGjUSt7m51raDiIgoWFnaBTZlyhSMGTMG3bp1Q48ePfDOO+8gKysL48ePByDG5pw4cQIffvhh5WsyMjIAAAUFBTh16hQyMjIQERGBDh06ABDdXk899RQ+/vhjtGrVqrLCVKdOHdQJkJ1HGzYUtwxARERE1rB0GjwgFkJ8+eWXkZ2djeTkZLzxxhu45pprAADjxo1DZmYmNm3aVHm+3vigli1bIjMzEwDQqlUrHDt2zOGc2bNn45lnnjHVJnem0XkiNxeIjxf3e/QAJk0CbrvN629DREQUVNz5/rY8AAUiXweg8nIgPBxQfvL8VyAiIqqaarEOUDALDQWcLEtEREREPsYAZBF5HBARERH5HwOQRdq1s7oFREREwYsByCJ/TXQjIiIiCzAAWaRWLatbQEREFLwYgCzCAERERGQdBiCLMAARERFZhwHIIgxARERE1mEAskh0tNUtICIiCl4MQBZhBYiIiMg6DEAWYQAiIiKyDgOQRaKirG4BERFR8GIAsoh2U/vycmvaQUREFIwYgAJESYnVLSAiIgoeDEABorTU6hYQEREFDwagAMEKEBERkf8wAFlozRr7fQYgIiIi/2EAstCNN9qnw7MLjIiIyH8YgCwWHi5uWQEiIiLyHwYgi0VEiFsGICIiIv9hALIYAxAREZH/MQBZLCZG3ObnW9sOIiKiYMIAZLF69cTtlCmAJFnbFiIiomDBAGQxOQDt2gWkp1vbFiIiomDBAGSxsDD7/aIi69pBREQUTBiALFZYaL+vDENERETkOwxAFlMGIFaAiIiI/IMByGLl5fb7xcXWtYOIiCiYMABZ7B//sN9nBYiIiMg/GIAsdtVVQK9e4j4rQERERP7BABQA6tQRt6wAERER+QcDUACIjBS3rAARERH5BwNQAIiKErcPPgjs3GltW4iIiIIBA1AAkAMQAIwcaV07iIiIggUDUACQu8AA4Phx69pBREQULBiAAswll1jdAiIiopqPASgAnD1rv3/oEPDLL9a1hYiIKBgwAAWAM2fUj++6y5p2EBERBQsGoACgrAABwM8/W9MOIiKiYMEAFADi49WPW7a0ph1ERETBggEoACxcCAweLLbFAIDoaGvbQ0REVNOFWd0AEjO/1q0D9u4FOnUCTp2yukVEREQ1GytAAUTuCjt9Gigvt7YtRERENRkDUABp0EDcShJw7pylTSEiIqrRGIACSHi4fWd47cwwIiIi8h4GoABTt664ZQAiIiLyHQagAFOvnrhlACIiIvIdBqAAwwBERETkewxAAYYBiIiIyPcYgAKMHIA4C4yIiMh3GIACDCtAREREvscAFGAYgIiIiHyPASjAMAARERH5HgNQgGEAIiIi8j0GoADDhRCJiIh8jwEowMgVoF27gBdesLYtRERENRUDUICRAxAAzJolNkYlIiIi72IACjDKAAQAJSXWtIOIiKgmszwALVy4EElJSYiKikJKSgo2b95seG52djbuvPNOtGvXDiEhIZg0aZLueatWrUKHDh0QGRmJDh064LPPPvNR671PG4AuXLCmHURERDWZpQFo5cqVmDRpEmbOnIndu3ejT58+GDJkCLKysnTPLy4uRnx8PGbOnInOnTvrnrNt2zaMGjUKY8aMwc8//4wxY8bgtttuw/bt2335q3hNZKT6cUGBNe0gIiKqyWySZN0ok+7du6Nr165YtGhR5bH27dvjpptuwrx585y+tl+/frjiiiswf/581fFRo0YhPz8fX3/9deWx66+/HvXq1cMnn3yie63i4mIUFxdXPs7Pz0diYiLy8vIQGxvrwW9WNTab/f6+fUCHDn5vAhERUbWTn5+PuLg4U9/fllWASkpKkJ6ejkGDBqmODxo0CFu3bvX4utu2bXO45uDBg51ec968eYiLi6v8SUxM9Pj9vY1dYERERN5nWQDKzc1FeXk5EhISVMcTEhKQk5Pj8XVzcnLcvuaMGTOQl5dX+XP8+HGP39/b2AVGRETkfWFWN8Cm7O8BIEmSwzFfXzMyMhKR2sE3AYIBiIiIyPssqwA1bNgQoaGhDpWZkydPOlRw3NG4cWOvX9NK7AIjIiLyPssCUEREBFJSUpCWlqY6npaWhp49e3p83R49ejhcc/369VW6pr99+KH9PitARERE3mdpF9iUKVMwZswYdOvWDT169MA777yDrKwsjB8/HoAYm3PixAl8qEgEGRkZAICCggKcOnUKGRkZiIiIQIe/pkqlpqbimmuuwUsvvYQRI0bg888/x4YNG/DDDz/4/ffz1JgxwJdfAv/+NwMQERGRL1gagEaNGoXTp09jzpw5yM7ORnJyMtauXYuWLVsCEAsfatcE6tKlS+X99PR0fPzxx2jZsiUyMzMBAD179sSKFSswa9YsPPXUU7jkkkuwcuVKdO/e3W+/lzc0bixuqzAenIiIiAxYug5QoHJnHQFfee01YNo04I47gI8/tqQJRERE1Uq1WAeInJOXIjJYFJuIiIiqgAEoQLVoIW4ZgIiIiLyPAShAybP2c3OtbQcREVFNxAAUoGJixG1hIVBWZm1biIiIahoGoAAlByCAU+GJiIi8jQEoQEVGAhER4n5+vrVtISIiqmkYgAKYXAU6fNjadhAREdU0DEABTA5AAwYAmzdb2xYiIqKahAEogCnHAc2aZV07iIiIahoGoACmDEBhlm5aQkREVLMwAAWwkhL7/dBQ69pBRERU0zAABbBOnez3T52yrh1EREQ1DQNQAHvzTeDJJ8V9bolBRETkPQxAASw6GnjiCXH/zBkuiEhEROQtDEABLjYWiIsT948ft7YtRERENQUDUDXAneGJiIi8iwGoGmjeXNzu3w/s22dtW4iIiGoCBqBqoGlTcTtlCpCcDKSnW9seIiKi6o4BqBqQA5Dsyy+taQcREVFNwQBUDSQkqB/Xrm1NO4iIiGoKBqBqICJC/Tgy0pp2EBER1RQMQNXA7berH1+8aE07iIiIagoGoGogJgZ4/HH74/PnrWsLERFRTcAAVE3MmGG/n59vXTuIiIhqAgagaqJuXeDFF8V9VoCIiIiqhgGoGomNFbfvvw8MGQJ88YWlzSEiIqq2GICqEXlPMABYtw4YPhw4fdq69hAREVVXDEDVyIABjsfS0vzfDiIiouqOAagaSUgAhg1TH9u0yZKmEBERVWsMQNVMvXrqx5mZljSDiIioWmMAqmaKitSP//jDmnYQERFVZwxA1Yx2CvyJE9a0g4iIqDpjAKpmBg8Wt2Fh4vbMGceqEBERETnHAFTNTJgALFsG/PabfVPUP//UP1eSuGo0ERGRHgagaiYiArjnHqBFC7E6NACcOydu331XLJa4dat4fPfdQHw88OuvVrSUiIgocDEAVWNyALriCuDrr4EHHhBjhHr1At5+G1i+HCgpEcGIiIiI7BiAqjHlytBDh6qfGz/efr9BA/+0h4iIqLpgAKrGlAGIiIiIzGMAqsYKC82d98QTQF6eb9tCRERUnTAAVWO5ufrH+/VzPPbeez5tChERUbXCAFSNnTqlf3z1asdjkycDFy8CxcXAV18BFy6ony8o8H77iIiIAhUDUDWmHOispN0vTPb228BjjwE33CC6xWRPPSVes2WL99tIREQUiBiAqrGnngK++AK4+mr7sWnTxK28UrRSejrw5pvi/ltviduKCuD554GyMnFLREQUDHS+Jqm6iIwU1Zzu3YElS4DGjYE77xTP7dsH/O9/wEMP2c//6CP7/ebNxe1TT9mPNWrk+zYTEREFAgagGiA+HnjySfWxtm3FT8eOQO/ejq9JSBC3L71kP8Zp9UREFCzYBVbD9eoFfPaZ4/Fz54CzZ9VVH06VJyKiYMEKUBDo2tXx2G+/AfXrq4999ZXYQNVm80+7iIiIrMIKUBBQboWhHPOjdfo0sHKl2E/soYeA77/3fduIiIiswAAUBKKj7febNAGiotTPv/qq/f4ddwBDhgCLFwN9+/qnfURERP7GLrAgYLMBtWqJrTOuu04slHjmjBgfFBUFHD+uPl+5HtDu3UCXLv5tLxERka8xAAWJo0fFytGXXip+lBISxAwwvUHQXbuKcUEA8MwzYur9jBk+by4REZFPedwFdvjwYXzzzTco/GtHTkn+lqSAlJAAJCfrP2eziRWijZw8CWRkAM8+K6bbnzkjjpeXA9nZXm8qERGRz7kdgE6fPo2BAweibdu2GDp0KLL/+ga8//77MXXqVK83kPwjIsL4uYQEdTfY4cNATo7oPmvaFPjhB9+3j4iIyJvcDkCTJ09GWFgYsrKyEK0YXTtq1CisW7fOq40j/ykvN3/u/fcDV14pts8A1IsplpQAq1bZq0RERESByO0xQOvXr8c333yD5vJeCn9p06YNjh075rWGkX+5E4D27lU/jowUu8wvWADs3An8+99i9enNm73bRiIiIm9xuwJ04cIFVeVHlpubi8jISK80ivzvnns8f21kJPD668Djj4vwAzh2i2VminWGiIiIAoHbAeiaa67Bhx9+WPnYZrOhoqICr7zyCvr37+/VxpH/NG0qNk/1RHGx415kSjk5QFIS0LAhsHQp0K0b8Pvvnr0XERGRN7jdBfbKK6+gX79+2LlzJ0pKSvD4449j3759OHPmDLYoF5Chaicx0bPXrVrl/HnlXmT33y9u58wB3nnHs/cjIiKqKrcrQB06dMCePXtw1VVX4brrrsOFCxdwyy23YPfu3bjkkkvcbsDChQuRlJSEqKgopKSkYLOLgSPfffcdUlJSEBUVhdatW2Px4sUO58yfPx/t2rVDrVq1kJiYiMmTJ6OoqMjttgUb5d5gw4cDS5ZU7Xr/+pcYDP3ww47PXbgA/PwzUFBQtfcgIiLyiGShFStWSOHh4dKSJUuk/fv3S6mpqVLt2rWlY8eO6Z5/5MgRKTo6WkpNTZX2798vLVmyRAoPD5c+/fTTynOWL18uRUZGSh999JF09OhR6ZtvvpGaNGkiTZo0yXS78vLyJABSXl5elX/H6qS8XJLEsoeSNHu2OCY/1vu55BLnzwOStHmz/vFWrcTtFVc4tqO01K+/NhER1RDufH/bJMm9FQy/d7FD5jXXXGP6Wt27d0fXrl2xaNGiymPt27fHTTfdhHnz5jmc/8QTT2DNmjU4cOBA5bHx48fj559/xrZt2wAAEydOxIEDB/Dtt99WnjN16lTs2LHDZXVJlp+fj7i4OOTl5SE2Ntb071MTyDvBT58OzJsHxMSoqzRLlgAPPCDunzkDNG8OXLxofL20NLH9hjPKv8D//AcYOxb4+GPgpps8+hWIiChIufP97fYYoH79+jkcs8nfmgDKTc6nLikpQXp6OqZPn646PmjQIGzdulX3Ndu2bcOgQYNUxwYPHoylS5eitLQU4eHh6N27N5YvX44dO3bgqquuwpEjR7B27VqMHTvWsC3FxcUoLi6ufJyfn2/qd6jJ5I/j66+BPn3E/bZtgXbt7OfUrStWl96xQ/8aCQmiq8sdt90mbm++WR2MiIiIvMntMUBnz55V/Zw8eRLr1q3DlVdeifXr15u+Tm5uLsrLy5GQkKA6npCQgJycHN3X5OTk6J5fVlaG3NxcAMDtt9+O5557Dr1790Z4eDguueQS9O/f3yFoKc2bNw9xcXGVP4mejgauATp1ErejRonb3r3FLK6ZM4FvvhEbqN5yi6gQ2WxAixbG1/rzT/FaV86erXq7iYiI3OF2BSguLs7h2HXXXYfIyEhMnjwZ6enpbl1PWT0CxJ5i2mOuzlce37RpE1544QUsXLgQ3bt3x+HDh5GamoomTZrgqaee0r3mjBkzMGXKlMrH+fn5QRuCtm0DTpwA2rSxH0tIAJ5/3v5YOeuraVP7/TlzRNfV448DDz0kqkj79rl+z/r1gdxcoEGDqrefiIjIDI83Q9WKj4/HwYMHTZ/fsGFDhIaGOlR7Tp486VDlkTVu3Fj3/LCwMDT469vzqaeewpgxY3D//fejY8eOuPnmmzF37lzMmzcPFRUVuteNjIxEbGys6idYRUerw48rTZrY7/fvDxw4IBZVbNRIHDP7J/HVV+bfk4iIqKrcrgDt2bNH9ViSJGRnZ+PFF19E586dTV8nIiICKSkpSEtLw80331x5PC0tDSNGjNB9TY8ePfDFF1+ojq1fvx7dunVDeHg4AODixYsICVHnutDQUEiSxB3rfUC5ukBKiv1+o0bA8eMiEJlhtIj4zp3AihXA008DQZxLiYjI29ydYmaz2aSQkBDJZrOpfnr06CEdOHDArWvJ0+CXLl0q7d+/X5o0aZJUu3ZtKTMzU5IkSZo+fbo0ZsyYyvPlafCTJ0+W9u/fLy1dutRhGvzs2bOlmJgY6ZNPPpGOHDkirV+/Xrrkkkuk2267zXS7gnUavCd27RLT2Tt3Vh8fMsT1FHnlT926ktS1q/qYJNnvX365JP31Z0FERKTLne9vtytAR48eVT0OCQlBfHw8oqKi3A5fo0aNwunTpzFnzhxkZ2cjOTkZa9euRcuWLQEA2dnZyMrKqjw/KSkJa9euxeTJk/HWW2+hadOmWLBgAW699dbKc2bNmgWbzYZZs2bhxIkTiI+Px4033ogXXnjB7faRa126AHv2OA6GlrvA9MTEAOfPq4+dOwfs2mX8mn37xOBrN4eYERER6XJ7HaBgEMzrAHnL448Dr7yi/1xSEqDJ0bokyb4ukfIYERGRHq+vA7RgwQLTb/7oo4+aPpdqLnk6vVabNmL9IDMBSGfJKZWCAqBOHXdbRkREZLIClJSUZO5iNhuOHDlS5UZZjRWgqjt1Sr8b7JdfgH/8w77P2FVXGS+kqEf+a01LAwYPBl54AZgxo+rtJSKi6s/rFSDtuB8iV+LjgXXrgM8/FxurNm8OXH656NLq188egCZNAjIzgSefdO/6EyeKMPTkk0Dt2uIYi49ERGQWxwDpYAXIty5csHdd7dwJdOgg1h8yQ/5rvfpqYPt29XNnz4ruNSIiCk4+3QsMAH7//XesWbMGWVlZKCkpUT33+uuve3JJCiK1awPHjgEZGfa1g1q0ABQT/lyKj3c8duECAxAREZnjdgD69ttvMXz4cCQlJeHgwYNITk5GZmYmJElC165dfdFGqoFatFBPnd+wQUyFlyRgzRoxtkdPRQUQEgLUq+f4XPPmYmzQwIE+aTIREdUgbm+FMWPGDEydOhW//PILoqKisGrVKhw/fhx9+/bFyJEjfdFGCgJt2gBXXikGRdevb3xeSQkwejTwr3/pPz9smG/aR0RENYvbAejAgQMYO3YsACAsLAyFhYWoU6cO5syZg5deesnrDaTg42xqe7duYsNVI5oeWSIiIl1uB6DatWujuLgYANC0aVP89ttvlc/l5uZ6r2UUtJwFIDO7y+flea8tRERUM7k9Bujqq6/Gli1b0KFDBwwbNgxTp07F3r17sXr1alx99dW+aCMFmZiYqr1+4EDgp5+80xYiIqqZ3A5Ar7/+OgoKCgAAzzzzDAoKCrBy5UpceumleOONN7zeQAo+8ro+ntq5U8woS0x03EqDiIgI8CAAPffcc7jrrrsgSRKio6OxcOFCX7SLgliY4q+yZUsxZd5dLVsCCQnAp5+Kx717e6dtRERUM7g9Buj06dMYNmwYmjdvjqlTpyIjI8MHzaJgFqL4q0xN9fw6f/4J9OkjfjztEuMyoURENZPbAWjNmjXIycnB7NmzkZ6ejpSUFHTo0AFz585FZmamD5pIwUa5PlCIzl/oXz2wbrnqKsDdNTrHjRPT8y9ccP/9iIgosLkdgACgbt26ePDBB7Fp0yYcO3YM99xzD/71r3/h0ksv9Xb7KAi1aAF88QXwww/6z0dHi26x115zfM7ZDvJTp9pXmz55Uvw488EHwG+/if3MiIioZvEoAMlKS0uxc+dObN++HZmZmUhISPBWuyjI3XAD0KuXfheUzSZC0pgxjs8ZLZAo+/NPoKhIjA9KSADKyrzTXiIiql48CkAbN27EAw88gISEBIwdOxYxMTH44osvcPz4cW+3j4KcszE48fHAffepj8XGOl9Juk8f9Z5j58+7fl+jmWQFBWJwtXb9T44bIiIKfG4HoObNm2Po0KE4deoU3n77bfz555947733MHDgQIToDdgg8qJrr1U/fvddYO9e++PoaCA83P741lvV5xcXA2+/bX+8axcwfTpw+rTjeTI5AL39NrB0qf34J58AW7aI18vGjQMuuwy4eNH0r0RERBZwexr8008/jZEjR6Ke3m6URF6mrKZ8+KEYzKyVnAzMmiUWUAwLU1dsGjZ0PF85GFreODUzE1ixwn68qMh+32YDcnOB8ePF4zZtgGXLgA4d7OeUlorg9cEH4vEXXwCjRpn6FYmIyAJuB6AHH3zQF+0g0qUMQHpjfmTPPWe/rwxAzrbVUNq61X5/yxbRlSarqADy8+2P+/Z1fP2JE0CrVvbH5eXm3peIiKzBPiuqcZo3t9+Pjnbvta++Ksb13H23/VhxsajwOKNdrLGiwr33JSIi/2IAooDWs6f7r/nkE6BxYzFA2mwAkqtGjz0mbpXrexYVuV4L6NQp9WMOhCYiCmwMQBTQevQANmwAjh41/5pLLgF+/10MkDa7r1hWlrrbS6m42HUAKilRhx5WgIiIApvbY4CI/G3AAPdfExoqbt3pAjOaEl9U5Hr16ZISdTcZK0BERIGNFSCq0YyqOu4oKlJ3ienRBiBWgIiIAhsDENVo3btX/RoXLgBPPun8HFaAiIiqFwYgqtFatBDrA1XFkiWuz9EGIOU0+LVrgSuuED9vvFG1thARkXcwAFGNd+SI8XYWZpw75/ocbQBS7jE2bBjw88/iZ8oU9SKLRERkDQYgqvEaNlSv2gyIUGLE2V5iRrQBSLmVhtbOne5fn4iIvIsBiIKCckzO8eNiq4qvv9Y/98or3b++drHEkhLjc//v/9y/PhEReRenwVNQUAYgeaVoeaq8VuvW7l/fqAKkF4RcrSpNRES+xwoQBYUrrnA8pheA7rgDSEx0//raACQHn4kTHc9Vjg8iIiJrsAJEQeHNN4H4eGDcOPuxq69Wn3PhAlCrFvDRR+5f36gCpDeDjBUgIiLrMQBRUGjQAPjHP9THoqOBwkJg6VKgbVv7qtHt29vPiY1V7wRvZPFi4NJL7Y+djQFiBYiIyHrsAqOgFhUFTJgAXHed/ZhyxphyK40773R+rWnT7PeLi4Hly/XPYwWIiMh6DEBEGrVqAZGR4v7AgfbjAwea31vs3DlgzBj951gBIiKyHrvAiHRkZgInTohFC+VKTpcuomJ08aLr1585Y/zcM88AISHAU095o6VEROQJBiAiHY0bix9JAlJTRUWnUycRgMw4dsz5808/zQBERGQldoEROWGzAfPnA++/L6o2ZgPQr7+6PueNNzzfNX73buCrrzx7LRERsQJE5BazAcjMbvBTpgB16wL33KN+3cMPA3XqAK+8Yvzarl3F7b59jtt8EBGRa6wAEbnBbAAya8cO9eMjR8SU+ldfdb6fmIzbahAReYYBiMgN3g5AFy8CBw6I/ce++ALIy7M/d+GC69evXWvuPCIiUmMAInKDPD3eWwoLgdGjxQ7xw4cDZ8/an9MGm6IiYOZMYNs2+7GlS4FRo7zXHkkC/vc/4ORJ712TiCgQMQARuSE83LPX1a+vf7ywEDh82P741Cn7fW0AeuUVYO5coGdP9XFvDob++mtgwACgY0fvXZOIKBAxABG5IczDaQNZWWLWl1ZhoXpdIWUAGjkSeOkl++Nduzx7b3esXy9uWQEiopqOs8CI3OBpAIqO1q8eXbwIlJfbHysD0C+/ANOni3FHXbr4ZwXpRo3s94uLvd/lR0QUKFgBInKDp11gNpv+awsL1Y9zcx3PmTQJ6NtXHZTc8eOPYmaZman5tWrZ77tazJGIqDpjBYjIDfHxnr9Wr3qk3VZDWQHScrbDvDM9eojb5s2BG25wfq5y3NHx40Dbtp69JxFRoGMFiMgNCQmev1YvAJ07p36cnW38+hMnPH9vAPj5Z9fnKANQfn7V3o+IKJAxABG5QS8ALVoEJCXZHzdsqP9avS4w7WDj334zfu/MTOdtO3kS+OADx241WVGR89cDDEBEFDwYgIjc0Lix/f6QIWKW1vjxwPbt9uNPPQV8/73ja80MoM7JMX7OVYC59lpg3Djg+ec9ez0AFBTY7zMAEVFNxgBE5IYhQ4DLLgNGjBCrMD/+uDiuHDwcHg706SMWFGzXTtzKx32ltFTsCwaIFaX1sAJERGTHQdBEboiKEkHDZlMfVwYgebZV//7qvbrMzMLy1PHj9vvKKpUSAxARkR0DEJGbQnTqpqGhrl9XWur9tsguucR+v0kT/XPMbK7KAEREwYJdYER+opzGrgws3qYMaBUV9vveGgP0xx/AkiWOU/iJiKoTBiAiP1EGoMOHgSuu8M37KKs4yqrTf/4DzJnjvCtOuRu9UQDq2RN48EGxMaue3FzfdvcREXkDAxCRl8iLBg4bpv+8diHDiRPt96+/Hpg8Wdzv08f4PaKjXbfjwgV7ANGuHTR7thi8bUQZgM6f1z9HXiFa7zr//a9YLHLSJNftJCKyEgMQkZfs2QP8+SfQsqX+81ddpX58770iRHz1FbBqFfDaa2I6/ezZ6vOUgappU9ftWLtWnLd6tX5X28aNxq9VLsxotJ6QTG+fMHlW3IIFLptJRGQpywPQwoULkZSUhKioKKSkpGDz5s1Oz//uu++QkpKCqKgotG7dGosXL3Y459y5c5gwYQKaNGmCqKgotG/fHmud/WcvkRdERqo3E9Xq2lWsDyRXUGw2Ma1+6FBR2bHZREhSLqS4YQNw9932x/XqGV+/WTP7/Zwc4NZb9c9btEi/ulNUpK5S6QWg9HT7/agox+fNDAY3KycH+PBDc2OXiIjcZWkAWrlyJSZNmoSZM2di9+7d6NOnD4YMGYKsrCzd848ePYqhQ4eiT58+2L17N5588kk8+uijWLVqVeU5JSUluO6665CZmYlPP/0UBw8exJIlS9BM+e1AZJE+fYAWLZyfU7u2/X6vXkBMjP1xXJzx6y67zFwbLl4UO81//rk65Ci7v+TzlP78E+jWzf74p5/EdZT0Zsh56uqrgbFjHStiRETeYOk0+Ndffx333Xcf7r//fgDA/Pnz8c0332DRokWYN2+ew/mLFy9GixYtMH/+fABA+/btsXPnTrz66qu49a//3F22bBnOnDmDrVu3IvyvledaGvVJEAWgSy8Fpk8X09mjooA6dezPKccA9eolzv3gA/HYWfVJ6/rrxSDn7t2BLVtE5Ua7L1lhoRhLdPiw6ErLyHC8TseO6gHP3qwAyZWyzz8XK24TEXmTZRWgkpISpKenY9CgQarjgwYNwtatW3Vfs23bNofzBw8ejJ07d6L0r+kua9asQY8ePTBhwgQkJCQgOTkZc+fORXl5uWFbiouLkZ+fr/ohstK8ecCjj4r7ykUWld1OQ4YAt91mf2y0/o8e+U98+3bgxRfF/T//VJ9TWCimu7dtC0yYIKa/61FWirxZAZJxRhkR+YJlASg3Nxfl5eVI0OwumZCQgByDDZFycnJ0zy8rK0Nubi4A4MiRI/j0009RXl6OtWvXYtasWXjttdfwwgsvGLZl3rx5iIuLq/xJTEys4m9H5D3Kqo8yAMXEqB937Qrcd5/71581S3Sf9e0rHsvdbBcvAk8+Ke4vXiwqQXp+/dV+X1kBOnrU/bboYQAiIl+wfBC0TbOngCRJDsdcna88XlFRgUaNGuGdd95BSkoKbr/9dsycOROLFi0yvOaMGTOQl5dX+XNcua8AkcWUFaDISKB1a3H/xhvVAahOHeDdd4G//9399zh40H5friQVF6vDhzLoKB06ZL+vDEByO4mIApFlY4AaNmyI0NBQh2rPyZMnHao8ssaNG+ueHxYWhgYNGgAAmjRpgvDwcIQq/p+4ffv2yMnJQUlJCSIiIhyuGxkZiUi9Ob1EAUAbgPbsEeN1mjUDzp61PyePFdL5E3dLkyb2PczOnLEfNwpAp08D//gHcOQIUFamfu7kSffGJulhBYiIfMGyClBERARSUlKQlpamOp6WloaePXvqvqZHjx4O569fvx7dunWrHPDcq1cvHD58GBWKPQAOHTqEJk2a6IYfokCn7AKz2cQsMXlSo7ICJM8ec7br/OWXu34/5TR8JaMA9NlnYuHDBQuA3bvVzylXpfaUcjsPPUVF5vY5IyJSsrQLbMqUKXj33XexbNkyHDhwAJMnT0ZWVhbGjx8PQHRN3a1YBGX8+PE4duwYpkyZggMHDmDZsmVYunQppk2bVnnOQw89hNOnTyM1NRWHDh3CV199hblz52LChAl+//2IvEFvp3mZuwGoc2fX72c0k8sozGRmGl/L12v4VFQAbdqIqpUvN5sloprH0mnwo0aNwunTpzFnzhxkZ2cjOTkZa9eurZy2np2drVoTKCkpCWvXrsXkyZPx1ltvoWnTpliwYEHlFHgASExMxPr16zF58mR06tQJzZo1Q2pqKp544gm//35E3qAMNNpqiF4AclboTE72Xrtkf80/0OWNyoyzLrCCAuD338X9rCzfbjJLRDWLpQEIAB5++GE8/PDDus+9//77Dsf69u2LXbt2Ob1mjx498OOPP3qjeUQBRRsGlGFHDkPOKkDKNYXMvocrynFCWp5UgCRJdPWZaY/yOe06RkREzlg+C4yIzNNWgJTjg2Jjxa0yFCm7zwDfrNPjjKsKUEYGsHKl/fGaNUD9+sCXX9qPOQtAykHX2pWsiYicYQAiqkb0AtDXX4sfubqjrAD1768+30wA6twZOHBA/zmbzb7ytBmuKkBdugC33y5WowaAESNEJefGG+3nOAtAyvVNnVWiiIi0GICIqhG9GVHXXy9+ZMoK0OzZgHINUDNbVUyeLBZGNFrHx1kXm5a2AlRcrP877NtnfA2zFaDTp823i4iIAYioGjEzPkcZUOrWta/mDKjH1ugZONA+lkjbfSa/3p0AtGSJvWvqxAkxW0u5fYfMWWXK6HcuKgL+/W/7YwYgInIHAxBRNfD442KLilmzXJ/ragyQ2Z1ewnSmSFRUuBeAvvwSGDcOmDIFaN5cLNy4apV4Ttl9JQcg5aw2I3IFado0Ua2SKReFJCJyhQGIqBp46SUx3TwpyfW5ymqKcpC0/Ny6dWKDU1eMKi9mApAyeP33v8Abbzieo7eJqjyV36gdDz4ING0qPot331WfV1joul3+MmoU0Lu3OuQRUWBhACKqJvQqMnqUX7pyELn9dhEcbr0V6NBBjLnp2FE8Z1R1qUoAiolxfc7IkY7HtIENEF1n6eni/pIlYtf6lSsdxxIFSgCqqBBdc1u2AL/8YnVriMgIAxBRDaMcGCyHm48/Bo4ds0+VDwsT21ZUVAD5+fbzlaHHlwFIkoBvvrE/lmeL6QUgAOjWTb3OT506ju1TVpS0cnPFJrE7djhvlzcoZ765011IRP7FAERUwygDkNy1ZLM5VpBCQ90f1AyYq0S5CkAlJerHhYViELNyV3qto0ft98vKHAOQswrQhAnAO+8A3bs7b5cntmwRm77qtYMBiChwWb4SNBF5l3ZHdneYWYHZzJd6XJzz57VhpagIUGz7p0u551hennsVoB9+cH5tT23cCFx7raisybPdlL+bq1l3RGQdVoCIahhPAtBf2+/hllvsx/QCkJmKUcuWrjdd1S6QWFgIrF3r/DWnTtnv5+e7NwZI2c132WUiuGiVlQHTpwNpac7bcfGi/TNet87x+sp2eDIIurwc6NVLf7kAIvIeVoCIapj27d1/zU8/ifExygUV9QLQd9+5rmoMH+66C0wbVswMYD5xwn5fb9sLZxWgggL7/YMHRdXm1CmgYUP78WXLxGy7l14yrn4VFIjqVlIScPgwEBnpvB2eBKCMDGDrVvdfR0TuYQWIqIa5/nrg7beB7dvNvyY+Hhg2TL1StF4I6NNH7Cg/YADwyCP610pKcj1d/88/1Y+LilwHK3nXd0A/ALk7C+yPP9SPlWOMlJYvt0/j37lTVJ5++008Vs6gkytSVa0AKStb7m5MS0TmsQJEVMPYbGK9nKrSfvmOGiVuw8OBDRvE/YgI4LXX1OfFxIg9vpzp0UP9uLBQDNh2FhhcBSBnFSA92m06jFajHjNG3LZuDcycaT8uSeoK0PnzojrkTgD6v/8DbrhBXPeeexyfLy83v/wBEbmHFSAi0qVcUfrbb4H33nM859VXHY8NGgRcfrn+NY26xsysl6MMQOfPOz7vbgXIWQB66y3g5pvVY5Vuukm9Z1lpqbpaI69E7U4AuusuUU26917957mQIpHvMAARka733hNdY++8I8bM6O0NpvT3v4u1hlq0EJWR339Xd2t98IF9sLXW9u2uv+yVAUhvl/mTJ9V7g8mMrqu9hrKtEyeKFay1q00rlZSow44cgMyMAfrf/8QebYcO2Y/pDQKvyow+0v87IZIxABGRrpQUMVbngQecn5ecLG7vu0+EH1mzZurA06uXub2+jChnWhl9sY0a5dh1d+GC/rna43pdYNqxSkolJeqw404FaMAAYN48dSVr2DDH81atEuHz+HHjdpC+Bx8Uod3Z2lIU3BiAiMiQmXVstm8Hfv0VuPJKx+fOnLHfb93a+a7v7vjpJ+PntF1bRgGooAA4cAB44glg8WLg2Wcdz3HWraatAJ08Kcb0KINaVbuwxo4VU/anTKnadYLRkiXiVq+blgjgIGgiqqLoaODSS/WfU4YRm839gcqeWLZMbJ1x1VXi8cSJ+ucVFABXX60OLFrO2qutAL3+umMwkwOQJJlfFFHvvNxcc6/1hxMnxL95vXpWt8QcrsZNRlgBIiKf0VZjnnrK9+85YYLY8mL/fvF49Wr98woKnIcfwL0KkF5VqrxcTKNv0AD4/nvn7yXTLvAI6K83ZIXTp4HmzYH69a1uiXmcRUdGGICIyG9uuw3YtMl4lpg3bdni/HmjrjGl9983fq642HVFq7xcTKM/exa49VbX7wfoD3xWzshTys7271pBrmbr/fabWCvqq6/80x4zWAEiIwxARORXffsad5l5U3Gx83CgN5XeHdoKkB7lGKDSUnPX1Rs3pBeA3n0XaNoUSEwEli41d+2qctWNN26c2Hfthhv80hxTGIDICAMQEfmdP76UiovN7w/miXffBc6dc36OXneWq4HRes+fPStC43PP2Y899JC4PXECuP9+x8UhT5xw7IKsKlcByNmsOaswAJERBiAi8jt5z7HwcLE5qS8UFzuv8uitJu2OhQuBH390fo4yzMjhwdXaNHoB6H//E91LTz9tP6btKlM+3rtXjNWRB4J7izIA6YU7d7vjdu0CPv64am1yhQGIjHB4GBH53T33ALVriy0xGjdWrw80bJh3xpAUFTmv8riq3niDXphx1W3m6eKHytd98om43bPHs2uZUV7uuKyBXihyJiVF3DZrJrpGvUX5uTMAkRFWgIjIZ+Q9v0aMUB8PCQFuv10slKid4fTUU+ILsary88XijIC4nnYcjT8C0M03Ox7zpAKkZFRlUQYgs5WYM2eAlSvFeCYzUlP138/d99VSbjHiDcquP84CIyMMQETkM599BixYoL+PmNK//mW/HxsrxrRU1T/+AWzeLO7HxDhWK7S7wfuLswpQjx5i4UNnTp3SP64cZG02iDzwgAiiU6e6PvfXX0WXlUwvqHkagLy1QKZMGTJZASIjDEBE5DMJCcAjj7heNG/0aPv92Fjjad+eio11HMBr1fYSzipAP/7oeuXihATgzjsdj3sSgOQ1kv75T9fnFhSoH3tzo1azi0SaxT3AyAwGICKynM0GfP458OGHjt1Vr79e9evXru39L1lPubtrvR55jI+SJ11gTZuaf0/tNH5vdoF5uwKk7ALzZlCjmoUBiIgCwvDhYtFAQB2AlONOPBURYX0AMjsLzFNyQCkvB155xdxrGjY0d97IkWIDV6WqdoEpB0zLAWjDBrGhblqa+evoUX7GDEBkhAGIiAKOMgBpqwOZmZ5dz+oAJPNGBUiPHIA+/dT8a0JDXZ9TWCiuaaYLzJ0ApBx4Lf/bXHed6JocNMj4dR9/DDz6qPMZZwxAZAYDEBEFHO0YIGV4SUzUf42zKd8REd7vZvHU6dPund+ggbnz5C4p7eBuZ9PqlQFIPu/PP8WU9I8+Eo+NlhLwZgBy599m9GjgzTeN93gDGIDInAD5vwQiIjvtzB3lVGajL8uOHZ1fryoVoHbtjJ9LSnLvWu6ultyypbnz5AqQ9vds21ZMd9ejDEDyuJknnxQbt951l3hstJhkVccAKcfpePJvk52tfnzwIJCV5XhtBiAywgBERAFHWwFKSNA/Tx4fNHeu6+t5GoCmTgUWLTJ+vlcvc9eR9ybzVQC6804RXrSOHhVLAuhRhkk5NOTmqs8xqgDl5ooxO8quKKMAtH8/8Pvv6mPKkCKHKaNd7w8fduyCW7MGWLJEvOeZM2JFcfmzUoYzZwGorEyMbZoyxfgcqrkYgIgo4GgDUIsW6sd//CG2e5g/X3yxTp/u+nqedoFdfrnxFzMADB3q/PVffiluL14U4eell9x7f+3vbuT4cWDePP2gZzTuSBlYiopEqNFWdowC0JVXijE7yo1Y9QJQdrb4DLVdl8ouMLl6pVwRXJaRAbRpA3TqpD6+YQPw4IOiq06u/ACi/cpQ5iwAffut2GbkjTeMz/EWSRJ7upWWej5bjryLAYiIAk7duurHbduqHzdpAiQni/vNmrmu7mgrQD172u83auT8tbVrOwayRo2Ae+8VAWzgQOevHzbM/uW/ZInzc/WYrQDJjGaZFRcD//63egyScmr7K68A8fHA2rXq1znbTw0APvjAfl/vi91olWdlBUhuR61ajuetWiVujx7Vv84nn6iD04UL6tBTXi7apZ3GD5hfAdsbUlOB+vXF35I825GsxQBERAGnb18xBuX558XjuXOB1q3Vu6HrWbFC/7h2DNAXX9jvh4WJ9YeM2GyOFaCQEFH5SE3V32pB22XXpo243bbN+H2MGA36NqJXDbPZRHVo1Ch1YFNWe+bP17+es/3UAHV1SS8AGVU7lAHoxx/FY70A5GoMT1mZeixTQYFjBejWW0VQ1m5/4s+ZgW++ab8vDzAHxArb333nnfc4dkx0d1644J3r1XTcJYWIAk5IiHp7jCZNxG7orowaBdxyi/gv7HbtgDlzxPHQUHUXWP36YhPWnBwxhsfZejilpY4VIOWXujYAlZWJ91aO9WnSRNz+3/+J29atgSNHXP8+gPH4J3fJlZSMDFHViYnRr4pouaoAXbxov68XdrRjhPTWQ/r4Y/Hv40kA0p5TUOBYAfrsM3H/88+BsWPtzwXC0ghydXP/fqB9+6pdKzlZ/P75+WJPPXKOFSAiqlHCw0UlaNo09XHtl92WLcDMmWIbCGdbb7RpYz4AtWolwpZ2HI1cQTpxQtx27uzy16gUHW3+XCOSJAKfLDYWWLbMXAByVQFSBiCj95bJweSJJ+wb5cqWL/dOALpwwXgMUO3axtdwdyd7b6vqhrCSZB8onpFR5ebomjbN/h8VNQEDEBHVSMqp9Dab/f+477lH3LZuLbrYGjUyDkArVojBvtoqj/JLXfk+8ngi7Ze2PEZFHnPiTlXHG/uivfKK49IC993nfI0gmTe7wOT3e/ll/Wspx/LI5yrbqDdmR5LU52i7wJTdQc4CkBXT5ZWfTVX/nZXrPzlbEsJTR48Cr70GzJ5dc5YWYAAiohpJ+4X/4INiOvW77zqeK4/RAYA+fcTtVVeJLjXAsXqk/OJSjj+RKz1GFSCZvwMQINb2UWrQwDtdYMoApFdF0QtARpTdlHLYUX7ZGrXFWReYcg0kvQqT2bb5grIb0NlMQzOUQdUXi34q/5179wYOHfL+e/gbAxAR1UjKYCIHmEsu0f9yUHYPjR0LpKeL6dEy7Ren8ktdGY6MApB2erermWdKVf1ilGlXlG7TxvWXviS5rgAVFIiqgHZ6t7wmkV4XmJ7GjdWfpRzOlG3Ua4skOe8CUwYgbYVK7/1cOXlSjE/zxp5uyu7DqgZdZfvlf4vPP1cvEeDM+vXmxtkBYtC6/B8H1RkDEBERgB07gKefFgsKdu2q7i5p0AB48UX7Y6OZTWYrQNpp/s54qwKkFRnp+kv/nXeA9993fa05c4D33lN/LvPmAQcOqMNIWZl69pdSnTr6gUS5AKJeBai01HkF6OxZ+31n26XI/2YFBc7X6RkyBLj7bjGOqaqU3XNVHYOk7B4sKRGD3m+6ydwyCj/9BAweDFx6qfn3y8lxu4kBhwGIiAhirM+zzxp3kyi/8Iy+IOWwoq10aANQbKz5dnkrAMnhQV65Oj/fdQAaP9789fUqDdowUlbmOBVddviwejq4XgDSqwCVlDgGIGWYUAagSZPU6wlpu+cOHRKz4+6+2zio7dolbp0tnWCWMgBpQ/PevWKFau3K3EaUFanSUrFQpFl799rvG/1ta4/XhMUcGYCIqMbz9nRndytA2i4wTwPQww+bf90HHwD3329/LAeg+vXtj7057qVePf0uJuXYkbIy82veyAFIGZiMKkDK3yMvTx2Ijh9Xn795s/2+NpwtWCDuL18uKlLOZjxpt+bwhDIAzZ4NTJxo/ww7dRIrVE+c6Pi606fFjKxffhGPP/7YPnYNEKHQnYqS/DchX1uP9t/W6llz3sAAREQ1nr8CkNkKUEyM+fdSBqC6dYGUFHOva91arDw9bJh4LIcEec2j8+fNj3sxo3Ztx8/l3DnRpShzZ+zI3/4muiSVs5s+/dTxPG0X2Jkzzr+cly8XCxF+/rljAFJ2e5aViVAie/tt0SWofL4qVqxQh6jt24G33rKHGtnu3Y6vnTpVzMiSZ3uNHq1+XvuZKH39NTBjhtjCRe4S1AbGzEzXfxs1oQLEhRCJiNxU1TFAdeqYfy9lAJK3dTBDXj9I+97yYOj8fO9WgIqKHNt23XXqx59/bv56P/0kfpShZNkyx/PcDUBpaeIHABYvVl/HaM2lvDz3ugPNuOMO/S0xtFUu7WxGwPU6PyUlxksSKPeu++kn4NQpdZXuww/FquDXXKOu1inDoHyt6o4VICIiNxl9wcphRTvwVNsFZnZxw+ho9aw1d7od5OCgDUByd0dhoXe/xCZPdj1jTLm6t1mutnXQBqDTp82vU5OZab+vrQApuVrs0RU5cGl9/bXjMW3lRW+rlbg4+315TJeSdlyUTPv3I48vUgYgeUsU5bIJZ88Cq1erX6v3t1NeXr224WAAIqIaz1tdYPLsLe0qxjI5bHzxBTBokH3vL20IcbYgn9LkyerH5eX22Wg336x+rlYtMZNHJocsbfhSjvdwpVEjsYeWMyNGmL+eL2jHAB08aN/6wpXsbPv9sjLjQFjVhf8GDdI/rjemSVuV0wtAyjFkW7c6Pl9aqh+WjX4PV1P69QaE613/2mvF34ty6YFAxgBERDWe8r+Yq2L7djH41KiSIVeALr8c+OYb4OqrxWOzASgyUnQTJSWJDWCfeUb9fEWF6FY6e1Zs4aF83ebN6vWMjCpA7nS/9ewpNutUbh6r5c7UaV/QVoB+/RVYt87ca5U72ZeVqSshSkYzwoqLxQKb//2vufczc10zFSBXg+jz88XAaC2jLk+j31vmbI83+basTFSN8vKATZucXy9QMAARUY21cCEwYADwyCPeuV7btmJbCaOVnHv21D+urcLojev48EPxX87Dh4uNUmfMcPzyk7/o69ZVP/f992JwtHJ9IaMAFBmp//5aDRoAr78uKkvONot1trqyGXrjerScrZuknfXlKbMBSFlNfO45MdBcWY2bNk2sFXTxopiK7u6CiWYCkKsu1G++0T9u9Dm5CkB6r5MkseFvkyaiUqmcbTdtmgjqgb5lBgMQEdVYDz0kvoTcqXp4Yv9+8V/cN9yg/7yZLriICNdfbMpuB+UXozxOSFnpkqtR2gAUEeF4TDvz6NlnxcatSUmO76XX7qowCo1KzrYOKSgQM7SqymwAUlZDlKuFA+Lf57XXRAWqe3cRAtwdPK0NTHphVW9PNDP0Akl2tusAZLQH2z/+IVbGnj9fvYr00aPif3c7dnjWTn9hACIiqqL27cWsHqOg4+oLxixlANLb6kNZKZGPacNOeLhjReryy9WPp01Tv85ZAPL0yxgQXXZmqlGu9k5bv97zNshKS93vApPHeMlOnbLfl0OlspvNDG0blJ99RYUYOK1d28iM8+dFONNq2tT136felHhJUv8N6m2jYbToZaBgACIi8jFllcRoJ3QzlP8Fr/xilMNO+/aOr9F+eetVgJTuvtuxEmUUUvbs8XxPrIQEsQKxNwKQN5SVGf8uZn/HEyeq3g5nAeiDD8Q09o0b3b/uzJnA88/rP+dqlpteyK2ocB2Ahg61ZpNZs7gOEBGRjw0cCNx1F9Cli9jewFPKAKT88pG7wAYPFt1X8gJ5gBgjoxQaqg5A8qalMr3ZPXoVoIYNxft4GoD69RPXMLOnlDubx3pqyBD77zJtGvDqq/bgalQBUjpwQL2ukKe0YUT52X/5pefXdTYwWbldiJIkicUr9bbVkCR12w4f1r9GdjaQmGi6mX7FAERE5GMhIa7XwOnQwfV1jMYAyRUgm02snqykXZunrEwdgK64wvg99N5LJgewqu6KbmYMUUiIaIMvqwnK36NePXErLyhoJgCZ+fczo7BQHQqVFTKjFcT79nW+xUhenvOB5EbT1ktKjMdoVVSo22a0k7yz7lOrsQuMiMhCI0eKcR3Kqo2WvJ2Ecl0gZQXI2UwsbQWorEw9Bkg7JV8vAOl1U8lVp6lTjd/bDDNdYMePV322mTuUg8lLS6se8twxc6aYWSX77DOxvk5OjnEAcjXIv25d5+NxjAKQcp0kLe0YoP379c/ThtaiIrF0gHZhRSswABERWSg5Gbj+eufnLF8uKjnKkGSziXWCJk4U0/ON/P3v6sfaCpCZAKT3X/Hy4n6XXeYYssyQq1ZmAlD37o4Dt31JWS0pLgbmzfPfe+vZuBGYPt3zAASod3zXMlrB+8gR49dou8CMqnPa42+8IZYOuPVW42v7i+UBaOHChUhKSkJUVBRSUlKwWblVr47vvvsOKSkpiIqKQuvWrbHYSafrihUrYLPZcNNNN3m51URE/mOz6X/5zZ4NvPmm89cOH67+r/NOnZwHIL1FGvUCkLxzOqBemO+JJ5y3R8tMAEpN9W8FqEUL+/2zZ13vveUP584ZL6BZ1WUejAKsswCkHQRtRBuAfvrJfl+5GawVLA1AK1euxKRJkzBz5kzs3r0bffr0wZAhQ5CVlaV7/tGjRzF06FD06dMHu3fvxpNPPolHH30Uq1atcjj32LFjmDZtGvr06ePrX4OIyGPe3qleT/v2YobSnj3iy12vC+ydd4CuXY1nCinFxBivRhwdLbajGDjQXNtcfYk2aSLCjz8DUOfO9tB36FDVr1fVtZIA0R6jveCqGoCMuseWLDF+TUWFuWnuZWXAJ5/YB1LL+48BwL59ZlvoG5YGoNdffx333Xcf7r//frRv3x7z589HYmIiFi1apHv+4sWL0aJFC8yfPx/t27fH/fffj3vvvRevvvqq6rzy8nKMHj0azz77LFq3bu2PX4WIyC1TpojZMRMm+Of9mja1d6HpVYAeeABITxfnaTmbNq93btu29l3XlYsFerIlibxsgFEXmHbH+apq1EiEO/l39sb1q7JWkiwszPg6VQ1ARsHK1UKG2gH3en77TYxhu+460W2mrAj9+af5NvqCZQGopKQE6enpGKTZJW7QoEHYqre7G4Bt27Y5nD948GDs3LkTpYqVmubMmYP4+Hjcd999ptpSXFyM/Px81Q8RkS+99hpw7Jh7m5N6i7LqYmZj1rg4YOlSc9e+6ir7/YEDgf799d9Xr/Kl/b/+I0fE8gGAYwXIZhNbdaSmmmuXWfL4H3dCnz+Eh5sLQN27+6c9ZikHWJ85o17KQW+BRX+yLADl5uaivLwcCZoVrhISEpBjsDBETk6O7vllZWXI/auutmXLFixduhRLnNXuNObNm4e4uLjKn8RAXbSAiGoUf3R/6VF+CZndmf7ee+339TbH/PlnYMUKdeDRMuru+vpr4N13gR491MflrTgAdQCaMkWslzN5MtC8uf343/4G3H+//XGbNsZtMSKPSfI0ANls6vFR3mK2AnTttd5/76pQVnxOnFD/7XmjMlYVlg+Ctmn+H0CSJIdjrs6Xj58/fx533XUXlixZgobOdu/TmDFjBvLy8ip/jnuyzjgRUTWhHNzqrUpHp07AqFHOzzEKQNdfD7gq2Cu7wCZOtD9WdtnFxAA33mh/rNyk1Cw5AHkybufmm8V6PHorcgNV605zVgFShthLLvH8PapKXj9JSTnQ+cQJdSCyOgBZtkRRw4YNERoa6lDtOXnypEOVR9a4cWPd88PCwtCgQQPs27cPmZmZuFHxv4CKvzo3w8LCcPDgQVyi89cRGRmJyECrdxIR+YhynoknVSi9CpAZZmYNybRjfpQVIOV95ZT1CxfUgc6d95PJwceTBfzatAH69HHcI0y2YIFxOHIlLEy9y/vnnwMjRoj7yq1LWrXy7PreEB/vuKr0hQv2+7//zi4wAEBERARSUlKQlpamOp6WloaeBktP9ujRw+H89evXo1u3bggPD8dll12GvXv3IiMjo/Jn+PDh6N+/PzIyMti1RUQEYNEi8YW6cqV/39fMnJR168TaQtqd1pVhRhmOlNPoCwrUz4U4+YZr0MB+X9mNJgcgT4Kh/H5G3YpmpvwbWbPGvtryyy+ruwuVbVVO4fc3vY4XZQB68EHg//7P/jhoK0AAMGXKFIwZMwbdunVDjx498M477yArKwvjx48HILqmTpw4gQ8//BAAMH78ePzzn//ElClT8MADD2Dbtm1YunQpPvnkEwBAVFQUkpOTVe9R96//PNAeJyIKVnfeKcbLeGN6thkbN4pB3//8p9hz68AB++rWWoMHi+edMZoR5k4FqEsX+9TsRo1EdQIwH1JmzxZf+I0a2bv+rrxS3CoDUJMm9hWVq7IthHKj1fBw9b9du3bAbbcBzZoZL5boD/HxjseUAQhgF1ilUaNG4fTp05gzZw6ys7ORnJyMtWvXomXLlgCA7Oxs1ZpASUlJWLt2LSZPnoy33noLTZs2xYIFC3BrICwpSURUjfgr/ABi49N+/cT9HTvExpmdO7t3DWWVw2jEgjYAOasAhYUB69cDL7wAvP22qDoB5itAzzxjv9+unVjgTx5zpAxAl17qnQCkFBHh+BnI1Twza/MY6dRJrBXlKVcVIK2gDkAA8PDDD+Phhx/Wfe799993ONa3b1/s2rXL9PX1rkFERJ7zdAwQIGYsaTdgdZdROHGnCyw0VAxK1g5M9qSbqnNndaBTBiDlwOCqdIEpRUQYB9iqDGcdPrxqAUiv+hTIAcjyWWBERFQ9yGNlBgzw/3ubGZNTUGC+C0wbjuTd3MeMMf9+RpSDkpVT+d2pADnr2IiIEO1v106sIyVXr4CqBaCqrkmlN/bJWQAK2kHQRERUvfzwA/Dcc8B771ndEn3aAOSsAqStYm3dCmzZAowcqX++O50JoaFAZibw669ijJDMbAXohx+ARx4xfl4OZ7/8Avzxh/nf2RW9aezu0At4zvb7YgWIiIiqhZYtgVmz1DOoAklcnOMAabPdbXFxQM+expWfsWPda0vLlmL8j7IaZFQB0lZO2rVzHmSKi+3X8+YKLsoApFxQ0ixJAgYNEmszdekijrELjIiIqAqcdUl9+y3QrRuwerU6EJSWikHXymnuMlfjmJy9nzvrCynDjV4FaPRoYNkycT85GfjoIzGYWA45epw9VxXKFaU9Wa+ookKs6n3smH1A9MWLxuczABEREbngLJBce62YhdW1q2MACg/Xn53kSYiQx9oMH27+NcoKkF5wCg8XU9jPnAH27rUvD1BUZHxNXwUgZfUsNFQEmYULzb++okJUrsLC7NWuQB4DZPksMCIiIle0m6EaUXYzyV+wetUeVzse6QWutDTgk0/c6x5SVoD0rilXhbTjb5yFHOVaOt6kDUAtWgBXX+3Z680EIKsrQAxAREQU8ObMEYOU//535+cpQ4azAHTsmPttaN4ceOwx914TG+v8eaOB0QMGiGrKX7s5qbjaN81TejPoXK0X9be/icrbv/+tHrjNAEREROQFzZqpt1Eww1kXi7MuJi0zW3gYueYaoFcvMSBaj1EAqlsXyM8XW4Iou9wKC41XwvZESgqQni7uaytAgPEg69atxaa6w4YB48YBM2aon68OAYhjgIiIqEaSu4ruvVfcXnkl8NVXIlysWuX8tcpK0vffe96GsDAxrd1oGr2zCkvt2uquv/h474YfAOjdWwy83r5dPwAZte/HH8VnKa+bpCUHIL0KloxjgIiIiHxA/oJ95BExHb5rV7Fa8Zkz7i102KyZT5oHwPXaQMoKTNOm3n//ggL7wOtTp+zH5Wn4RhWg+Hhg6FDj65pZ9JEVICIiIh+QA1BICNC3r32rBjPhpyorQTvz8stijSBZx47Oz1euuZSQYO490tPFZq3durk+NzPTfl9ZAZKrZ57uGacNQEuWOJ5jdQBiBYiIiGokq7tY9Dz2mPj58Udg2zb7TvJGlDus161r7j26dhU/O3e6PvfoUft97RIC2mPu0Aagjh1Ft1p5uf2Y1QGIFSAiIqqRAjEAya6+Gpg82XWlSbk/lzsLMALA1KnGz7VoIW579rQfU3bHebsC1KSJ4+rWVv/7sAJEREQ1UlW+YH3VBeYuZehxt039+4sKj3JDVtkPPwD/+hfw4IP615c/u7AwMQvtzBnxGrO0YadxY/G7yNd96aWqza7zBgYgIiKqUTp1AvbsAe66y+qWWK9VK1Hl2bpVfTwxEXjySePXKcPj55+L2/h4IDfX3Ngi5TpLixaJSpIyzE2ebH5zWF9hFxgREdUoW7cCu3YBN9/s+TWuusp77fGW/v09e9333wN5efa1em66yfVr9Fab3rRJLET52WeuX79tm/3++PHiVhmA3O3O8wVWgIiIqEapXdu+G7mnXn9ddNvIU8StdOgQsHmz+zvSy0JDxYrUc+YAgwebC3d63YeXXw4sXmzuPWfMAKZNs4cfQN0t5my3e39hACIiItKoWxeYO9fqVght2oifqgoLE8sBmFHVAcqTJolVsK+4wn4sEKo+SgxAREREpNKrV9VeHxoqVt5WMrM4oj8FWHOIiIjIKkePAnv3Ol/l2VOsABEREVFAatVK/PhCIIz7UQqw5hAREVFNFGhdYAxARERE5HOxsVa3QI0BiIiIiHzO7F5m/sIARERERD7HAERERERBhwGIiIiIgg4DEBEREQWdRo2sboFagE1KIyIioprokUeAlSuBESOsbonAAEREREQ+FxsL7NljdSvs2AVGREREQYcBiIiIiIIOAxAREREFHQYgIiIiCjoMQERERBR0GICIiIgo6DAAERERUdBhACIiIqKgwwBEREREQYcBiIiIiIIOAxAREREFHQYgIiIiCjoMQERERBR0GICIiIgo6IRZ3YBAJEkSACA/P9/ilhAREZFZ8ve2/D3uDAOQjvPnzwMAEhMTLW4JERERuev8+fOIi4tzeo5NMhOTgkxFRQX++OMPxMTEwGazefXa+fn5SExMxPHjxxEbG+vVa5Nr/Pytxc/fevw3sBY/f9+SJAnnz59H06ZNERLifJQPK0A6QkJC0Lx5c5++R2xsLP/4LcTP31r8/K3HfwNr8fP3HVeVHxkHQRMREVHQYQAiIiKioMMA5GeRkZGYPXs2IiMjrW5KUOLnby1+/tbjv4G1+PkHDg6CJiIioqDDChAREREFHQYgIiIiCjoMQERERBR0GICIiIgo6DAA+dHChQuRlJSEqKgopKSkYPPmzVY3qUaYN28errzySsTExKBRo0a46aabcPDgQdU5kiThmWeeQdOmTVGrVi3069cP+/btU51TXFyMRx55BA0bNkTt2rUxfPhw/P777/78VWqEefPmwWazYdKkSZXH+Pn71okTJ3DXXXehQYMGiI6OxhVXXIH09PTK5/n5+05ZWRlmzZqFpKQk1KpVC61bt8acOXNQUVFReQ4//wAlkV+sWLFCCg8Pl5YsWSLt379fSk1NlWrXri0dO3bM6qZVe4MHD5bee+896ZdffpEyMjKkYcOGSS1atJAKCgoqz3nxxRelmJgYadWqVdLevXulUaNGSU2aNJHy8/Mrzxk/frzUrFkzKS0tTdq1a5fUv39/qXPnzlJZWZkVv1a1tGPHDqlVq1ZSp06dpNTU1Mrj/Px958yZM1LLli2lcePGSdu3b5eOHj0qbdiwQTp8+HDlOfz8fef555+XGjRoIH355ZfS0aNHpf/85z9SnTp1pPnz51eew88/MDEA+clVV10ljR8/XnXssssuk6ZPn25Ri2qukydPSgCk7777TpIkSaqoqJAaN24svfjii5XnFBUVSXFxcdLixYslSZKkc+fOSeHh4dKKFSsqzzlx4oQUEhIirVu3zr+/QDV1/vx5qU2bNlJaWprUt2/fygDEz9+3nnjiCal3796Gz/Pz961hw4ZJ9957r+rYLbfcIt11112SJPHzD2TsAvODkpISpKenY9CgQarjgwYNwtatWy1qVc2Vl5cHAKhfvz4A4OjRo8jJyVF9/pGRkejbt2/l55+eno7S0lLVOU2bNkVycjL/jUyaMGEChg0bhoEDB6qO8/P3rTVr1qBbt24YOXIkGjVqhC5dumDJkiWVz/Pz963evXvj22+/xaFDhwAAP//8M3744QcMHToUAD//QMbNUP0gNzcX5eXlSEhIUB1PSEhATk6ORa2qmSRJwpQpU9C7d28kJycDQOVnrPf5Hzt2rPKciIgI1KtXz+Ec/hu5tmLFCuzatQs//fSTw3P8/H3ryJEjWLRoEaZMmYInn3wSO3bswKOPPorIyEjcfffd/Px97IknnkBeXh4uu+wyhIaGory8HC+88ALuuOMOAPz7D2QMQH5ks9lUjyVJcjhGVTNx4kTs2bMHP/zwg8Nznnz+/Ddy7fjx40hNTcX69esRFRVleB4/f9+oqKhAt27dMHfuXABAly5dsG/fPixatAh333135Xn8/H1j5cqVWL58OT7++GNcfvnlyMjIwKRJk9C0aVOMHTu28jx+/oGHXWB+0LBhQ4SGhjok+ZMnTzr8VwF57pFHHsGaNWuwceNGNG/evPJ448aNAcDp59+4cWOUlJTg7NmzhueQvvT0dJw8eRIpKSkICwtDWFgYvvvuOyxYsABhYWGVnx8/f99o0qQJOnTooDrWvn17ZGVlAeDfv6899thjmD59Om6//XZ07NgRY8aMweTJkzFv3jwA/PwDGQOQH0RERCAlJQVpaWmq42lpaejZs6dFrao5JEnCxIkTsXr1avzvf/9DUlKS6vmkpCQ0btxY9fmXlJTgu+++q/z8U1JSEB4erjonOzsbv/zyC/+NXBgwYAD27t2LjIyMyp9u3bph9OjRyMjIQOvWrfn5+1CvXr0cln04dOgQWrZsCYB//7528eJFhISov0pDQ0Mrp8Hz8w9gFg2+DjryNPilS5dK+/fvlyZNmiTVrl1byszMtLpp1d5DDz0kxcXFSZs2bZKys7Mrfy5evFh5zosvvijFxcVJq1evlvbu3SvdcccdutNQmzdvLm3YsEHatWuXdO2113IaqoeUs8AkiZ+/L+3YsUMKCwuTXnjhBenXX3+VPvroIyk6Olpavnx55Tn8/H1n7NixUrNmzSqnwa9evVpq2LCh9Pjjj1eew88/MDEA+dFbb70ltWzZUoqIiJC6du1aOU2bqgaA7s97771XeU5FRYU0e/ZsqXHjxlJkZKR0zTXXSHv37lVdp7CwUJo4caJUv359qVatWtINN9wgZWVl+fm3qRm0AYifv2998cUXUnJyshQZGSlddtll0jvvvKN6np+/7+Tn50upqalSixYtpKioKKl169bSzJkzpeLi4spz+PkHJpskSZKVFSgiIiIif+MYICIiIgo6DEBEREQUdBiAiIiIKOgwABEREVHQYQAiIiKioMMAREREREGHAYiIiIiCDgMQERERBR0GICIiIgo6DEBEVCONGzcON910k9XNIKIAxQBEREREQYcBiIiqtU8//RQdO3ZErVq10KBBAwwcOBCPPfYYPvjgA3z++eew2Wyw2WzYtGkTAODEiRMYNWoU6tWrhwYNGmDEiBHIzMysvJ5cOXr22WfRqFEjxMbG4u9//ztKSkqs+QWJyCfCrG4AEZGnsrOzcccdd+Dll1/GzTffjPPnz2Pz5s24++67kZWVhfz8fLz33nsAgPr16+PixYvo378/+vTpg++//x5hYWF4/vnncf3112PPnj2IiIgAAHz77beIiorCxo0bkZmZiXvuuQcNGzbECy+8YOWvS0RexABERNVWdnY2ysrKcMstt6Bly5YAgI4dOwIAatWqheLiYjRu3Ljy/OXLlyMkJATvvvsubDYbAOC9995D3bp1sWnTJgwaNAgAEBERgWXLliE6OhqXX3455syZg8ceewzPPfccQkJYOCeqCfi/ZCKqtjp37owBAwagY8eOGDlyJJYsWYKzZ88anp+eno7Dhw8jJiYGderUQZ06dVC/fn0UFRXht99+U103Ojq68nGPHj1QUFCA48eP+/T3ISL/YQWIiKqt0NBQpKWlYevWrVi/fj3efPNNzJw5E9u3b9c9v6KiAikpKfjoo48cnouPj3f5fnLViIiqPwYgIqrWbDYbevXqhV69euHpp59Gy5Yt8dlnnyEiIgLl5eWqc7t27YqVK1dWDm428vPPP6OwsBC1atUCAPz444+oU6cOmjdv7tPfhYj8h11gRFRtbd++HXPnzsXOnTuRlZWF1atX49SpU2jfvj1atWqFPXv24ODBg8jNzUVpaSlGjx6Nhg0bYsSIEdi8eTOOHj2K7777Dqmpqfj9998rr1tSUoL77rsP+/fvx9dff43Zs2dj4sSJHP9DVIOwAkRE1VZsbCy+//57zJ8/H/n5+WjZsiVee+01DBkyBN26dcOmTZvQrVs3FBQUYOPGjejXrx++//57PPHEE7jllltw/vx5NGvWDAMGDFBVhAYMGIA2bdrgmmuuQXFxMW6//XY888wz1v2iROR1NkmSJKsbQUQUKMaNG4dz587hv//9r9VNISIfYj2XiIiIgg4DEBEREQUddoERERFR0GEFiIiIiIIOAxAREREFHQYgIiIiCjoMQERERBR0GICIiIgo6DAAERERUdBhACIiIqKgwwBEREREQef/Ae3yPZ63e3ySAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test acc: 0.8649\n",
      "torch.Size([64, 1, 28, 28]) torch.Size([64])\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "########################1调用cuda######################\n",
    "device = (\n",
    "    \"cuda\"\n",
    "    if torch.cuda.is_available()\n",
    "    else \"mps\"\n",
    "    if torch.backends.mps.is_available()\n",
    "    else \"cpu\"\n",
    ")\n",
    "print(f\"Using {device} device\")\n",
    "#########################################################\n",
    "\n",
    "\n",
    "train_loader, test_loader = load_dataset()\n",
    "x, y = next(iter(train_loader))\n",
    "print(x.shape, y.shape, x.min(), x.max())\n",
    "plot_image(x, y, \"image sample\")\n",
    "\n",
    "#####################2网络放入cuda###########\n",
    "# net = Net() \n",
    "net = Net().to(device)\n",
    "#########################################\n",
    "\n",
    "\n",
    "optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9) \n",
    "epoch_num = 1   \n",
    "\n",
    "\n",
    "train_loss = train(epoch_num, train_loader, net, optimizer) \n",
    "######################## 3-train用CUDA ##################\n",
    "########################################################\n",
    "\n",
    "plot_curve(train_loss)  \n",
    "total_correct = 0   \n",
    "for x, y in test_loader:\n",
    "######################## 4-test用CUDA #################################\n",
    "    x=x.to(device)\n",
    "    y=y.to(device)\n",
    "#########################################################\n",
    "    x = x.view(x.size(0), 28 * 28)\n",
    "    out = net(x)\n",
    "    # out: [b, 10] => pred: [b]\n",
    "    pred = out.argmax(dim=1)    #返回最大值的索引\n",
    "    correct = pred.eq(y).sum().float().item()   #计算正确的个数，eq()比较两个tensor是否相等，sum()求和，float()转换为浮点数，item()返回元素值\n",
    "    total_correct += correct    #累加正确的个数\n",
    "\n",
    "total_num = len(test_loader.dataset)    #测试集的总数\n",
    "acc = total_correct / total_num #计算准确率\n",
    "print('test acc:', acc)\n",
    "\n",
    "x, y = next(iter(test_loader))  #取出一个batch的数据，iter()返回一个迭代器，next()返回迭代器的下一个项目？？\n",
    "\n",
    "\n",
    "\n",
    "######################## 5-推理出预测标签用CUDA #################################\n",
    "x=x.to(device)\n",
    "y=y.to(device)\n",
    "#########################################################\n",
    "\n",
    "\n",
    "out = net(x.view(x.size(0), 28 * 28))   #预测，此时out是一个tensor，存储的是一组预测值，每个值是一个10维的向量\n",
    "pred = out.argmax(dim=1)    #取出预测值中最大的索引，即预测的类别\n",
    "\n",
    "\n",
    "##################6--绘图放回CPU##############\n",
    "\n",
    "\n",
    "x=x.to('cpu')\n",
    "pred=pred.to('cpu')\n",
    "\n",
    "#############################################\n",
    "print(x.size(),pred.size())\n",
    "\n",
    "\n",
    "plot_image(x, pred, 'test') #绘制图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "dl2024",
   "language": "python",
   "name": "dl2024"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.19"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
